#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
typedef int DataType;
typedef struct
{
    DataType data[MaxSize];
    int length;
}SeqList;

//初始化顺序表
void InitList(SeqList* L)
{
    L->length = 0;

}

//建立顺序表
int CreatList(SeqList *L, DataType a[], int n)
{
    if (n > MaxSize)
    {
        printf("顺序表的空间不够，无法建立顺序表");
        return 0;
    }
    for (int i = 0; i < n; i++)
        L->data[i] = a[i];
        L->length = n;
        return 1;
    
}

//判空操作
int Empty(SeqList *L)
{

    if (L->length == 0)
        return 1;
    else
        return 0;
}

//求顺序表的长度
int Length(SeqList* L)
{
    return L->length;
}

//遍历操作
void PrintList(SeqList* L)
{
    for (int i = 0; i < L->length; i++)
    {
        printf("%d ", L->data[i]);
    }

}

//按值查找
int Locate(SeqList* L, DataType x)
{
    for (int i = 0; i < L->length; i++)
    {
        if (L->data[i] == x)
            return i + 1;
            return 0;
    }
}

//按位查找
int Get(SeqList* L, int i, DataType* ptr)
{
    if (i<1 || i>L->length)
    {
        printf("查找位置非法,查找失败\n");
        return 0;
    }
    else
    {
        *ptr = L->data[i - 1];
        return 1;
    }

}

//插入操作
int Insert(SeqList* L, int i, DataType x)
{
    if (L->length >= MaxSize)
    {
        printf("上溢错误,插入失败\n");
        return 0;
    }
    if (i<1 || i>L->length + 1)
    {
        printf("位置错误，插入失败");
            return 0;
    }
    for (int j = L->length; j >= i; j--)
    {
        L->data[j] = L->data[j - 1];
        L->data[i - 1] = x;
        L->length++;
        return 1;
    }
}

//删除操作
int Delete(SeqList* L, int i, DataType* ptr)
{
    if (L->length == 0)
    {
        printf("下溢错误,删除失败\n");
        return 0;
    }
    if (i<1 || i>L->length)
    {
        printf("位置错误,删除失败\n");
        return 0;
    }
    *ptr = L->data[i - 1];
    for (int j = i; j < L->length; j++)
        L->data[j - 1] = L->data[j];
    L->length--;
    return 1;
}
int main()
{
    int r[5] = { 1,2,3,4,5 },x,i;
    SeqList L;
    Creat(&L, r, 5);
    printf("当前线性表的数据为:");
    PrintList(&L);
    Insert(&L, 2, 8);
    printf("执行插入后操作数据为:");
    PrintList(&L);
    printf("当前线性表的长度为:%d\n", Length(&L));
    printf("请输入查找的元素值:");
    scanf("%d", &x);
    i = Locate(&L, x);
    if (0 == i)
        printf("查找失败\n");
    else
        printf("元素%d的位置为:%d\n", x, i);
    printf("请输入查找的第几个元素值:");
    scanf("%d", &i);
    if (Get(&L, i, &x) == 1)
        printf("第%d个元素值是%d\n", i, x);
    else
        printf("线性表中没有第%d个元素\n", i);
    printf("请输入要删除的第几个元素:");
    scanf("%d", &i);
    if (Delete(&L, i, &x) == 1)
    {
        printf("删除第%d个元素是%d,删除后数据为:", i, x);
        Printlist(&L);
    }
    else
        printf("删除操作失败\n");
    return 0;
}
